/*

这是一些常见的 std::set 操作：
    insert(val): 插入元素 val。
    find(val): 查找元素 val，返回指向该元素的迭代器。如果元素不存在，返回 end()。
    erase(val): 删除元素 val。
    size(): 返回 set 的元素个数。
    clear(): 清空 set。
*/
#include <iostream>
#include <map>
template <typename K, typename V>
void printMap(const std::map<K, V> &map)
{
#if 0
    for (typename std::map<K, V>::const_iterator it = map.begin(); it != map.end(); it++)
    {
        std::cout << "{" << it->first << ", " << it->second << "} ";
    }
#else
    for (const std::pair<K, V> p : map)
    {
        std::cout << "{" << p.first << ", " << p.second << "} ";
    }
#endif
    std::cout << std::endl;
}

int main(int argc, char const *argv[])
{
    std::map<std::string, int> map{};
    map.insert(std::pair<std::string, int>("Chinese", 99));
    printMap(map);

    map.insert(std::make_pair("Math", 100));
    map["English"] = 100;
    printMap(map);

    std::map<std::string, int>::const_iterator it = map.find("Chinese"); // find 返回这个元素的起始位置
    while (it != map.end())
    {
        std::cout << "{" << it->first << ", " << it->second << "} ";
        it++;
    }
    std::cout << std::endl;

    map.erase("English");
    printMap(map);

    map.erase(map.begin());
    printMap(map);

    int count = map.count("Chinese");
    std::cout << count << std::endl;

    it = map.lower_bound("Chinese");
    std::cout << "{" << it->first << ", " << it->second << "} " << std::endl;

    it = map.upper_bound("Chinese");
    std::cout << "{" << it->first << ", " << it->second << "} " << std::endl;

    std::cout << map.size() << std::endl;
    std::cout << map.contains("Chinese") << std::endl;
    std::cout << map.empty() << std::endl;

    return 0;
}
